package com.agentlab.imitation.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
/**
 * 功能:通用的静态工具函数(用于日期和时间处理)
 * <p>Title: 并购网平台</p>
 * <p>Description: 通用工具类</p>
 * <p>Copyright: 安喆信,action (c) 2010</p>
 * @author 唐良飞
 * @version 1.0
 */
public class DateTimeUtils {

	private static final Log log = LogFactory.getLog(DateTimeUtils.class);

	/**
	 * 得到系统当前年的数据字符串
	 * @return strYear 返回的结果，格式 yyyy ，String 类型
	 * @exception 得到系统当前年的数据字符串错误
	 */
	public static String getYear() {
		String strYear = "";
		Date currentDate = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
		strYear = formatter.format(currentDate);
		return strYear;
	}

	/**
	 * 得到系统当前年月数据字符串
	 * @return strYearMonth 返回的结果，格式 yyyy-MM，String 类型
	 * @exception 得到系统当前年月数据字符串错误
	 */
	public static String getYearMonth() {
		String strYearMonth = "";
		Date currentDate = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
		strYearMonth = formatter.format(currentDate);
		return strYearMonth;
	}

	/**
	 * 得到系统当前年月日数据字符串
	 * @return strCurrentDate 返回的结果，格式 yyyy-MM-dd，String 类型
	 * @exception 得到系统当前年月日数据字符串错误
	 */
	public static String getDate() {
		String strCurrentDate = "";
		Date currentDate = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		strCurrentDate = formatter.format(currentDate);
		return strCurrentDate;
	}

	/**
	 * 得到系统当前年月日数据字符串
	 * @return strCurrentDate 返回的结果，格式 yyyy年MM月dd日，String 类型
	 * @exception 得到系统当前年月日数据字符串错误
	 */
	public static String getDateCN() {
		String strCurrentDate = "";
		Date currentDate = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日");
		strCurrentDate = formatter.format(currentDate);
		return strCurrentDate;
	}

	/**
	 * 得到系统当前小时，秒，分数据字符串
	 * @return strCurrentTime 返回的结果，格式 HH:mm:ss，String 类型
	 * @exception 得到系统当前小时，秒，分数据字符串错误
	 */
	public static String getTime() {
		String strCurrentTime = "";
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
		strCurrentTime = formatter.format(currentTime);
		return strCurrentTime;
	}
	
	public static String getDateTime(int i) {
		String strCurrentDateTime = "";
		try {
			//Date currentDateTime = new Date();
			SimpleDateFormat formatter = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss");
			//strCurrentDateTime = formatter.format(currentDateTime);
			
			
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.DAY_OF_MONTH, i);
			strCurrentDateTime = new String(formatter.format(calendar.getTime()));
			
		} catch (RuntimeException e) {
			log.error("返回当前日期字符串异常！" + e.getMessage());
		}
		return strCurrentDateTime;
	}
	/**
	 * 得到系统当前年月日小时分秒数据字符串
	 * @return strCurrentDateTime 返回的结果，格式 yyyy-MM-dd HH:mm:ss ，String 类型
	 * @exception 得到系统当前年月日小时分秒数据字符串错误
	 */
	public static String getDateTime() {
		String strCurrentDateTime = "";
		try {
			Date currentDateTime = new Date();
			SimpleDateFormat formatter = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss");
			strCurrentDateTime = formatter.format(currentDateTime);
		} catch (RuntimeException e) {
			log.error("返回当前日期字符串异常！" + e.getMessage());
		}
		return strCurrentDateTime;
	}
	
	public static String getDateTimeYMD() {
		String strCurrentDateTime = "";
		try {
			Date currentDateTime = new Date();
			SimpleDateFormat formatter = new SimpleDateFormat(
					"yyyy-MM-dd");
			strCurrentDateTime = formatter.format(currentDateTime);
		} catch (RuntimeException e) {
			log.error("返回当前日期字符串异常！" + e.getMessage());
		}
		return strCurrentDateTime+" 00:00:00";
	}

	/**
	 * 得到系统当前年月日小时分秒数据字符串
	 * @return strCurrentDateTime 返回的结果，格式 yyyy-MM-dd HH:mm:ss ，String 类型
	 * @exception 得到系统当前年月日小时分秒数据字符串错误
	 */
	public static Timestamp getDateTimeStamp() {
		return Timestamp.valueOf(getDateTime());
	}
	
	public static Timestamp getDateTimeStampYMD() {
		return Timestamp.valueOf(getDateTimeYMD());
	}
	public static Timestamp getDateTimeStamp(int i) {
		return Timestamp.valueOf(getDateTime(i));
	}
	
	/**
	 * 得到系统当前年月日数据字符串
	 * @return strYMD 返回的结果，格式 yyyyMMdd ，String 类型
	 * @exception 得到系统当前年月日数据字符串错误
	 */
	public static String getYMD() {
		String strYMD = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		strYMD = formatter.format(currentDateTime);
		return strYMD;
	}

	/**
	 * 得到系统当前年月日数据字符串
	 * @return strYMD 返回的结果，格式 yyyyMMdd ，String 类型
	 * @exception 得到系统当前年月日数据字符串错误
	 */
	public static String getNewYMD() {
		String strYMD = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
		strYMD = formatter.format(currentDateTime);
		return strYMD;
	}
	
	/**
	 * 得到系统当前年月日数据字符串
	 * @return strYMD 返回的结果，格式 yyyy年MM月dd日 ，String 类型
	 * @exception 得到系统当前年月日数据字符串错误
	 */
	public static String getNewYMDzh() {
		String strYMD = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日");
		strYMD = formatter.format(currentDateTime);
		return strYMD;
	}
	
	/**
	 * 得到系统当前年月日后N天数据字符串
	 * @return strYMD 返回的结果，格式 yyyyMMdd ，String 类型
	 * @exception 得到系统当前年月日数据字符串错误
	 */
	public static String getNewYMDzh(int i) {
		String strYMD = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日");
		try {
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.DAY_OF_MONTH, i);
			strYMD = new String(formatter.format(calendar.getTime()));
			
		} catch (Exception e) {
			System.out.println("异常");
			strYMD = formatter.format(currentDateTime);
		}
		return strYMD;
	}
	
	
	/**
	 * 得到系统当前年月日数据字符串
	 * @return strYMD 返回的结果，格式 dd/MM/yyyy ，String 类型
	 * @exception 得到系统当前年月日数据字符串错误
	 */
	public static String getDateMDY() {
		String strYMD = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
		strYMD = formatter.format(currentDateTime);
		return strYMD;
	}
	/**
	 * 获取当前时间
	 * @return
	 */
	public static String getNewHMS() {
		String strYMD = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
		strYMD = formatter.format(currentDateTime);
		return strYMD;
	}
	
	/**
	 * 得到系统当前年月日小时分秒数据字符串
	 * @return strYMDHMS 返回的结果，格式 yyyyMMddHHmmss，String 类型
	 * @exception 得到系统当前年月日小时分秒数据字符串错误
	 */
	public static String getYMDHMS() {
		String strYMDHMS = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
		strYMDHMS = formatter.format(currentDateTime);
		return strYMDHMS;
	}
	/**
	 * 得到系统当前年月日小时分秒数据字符串
	 * @return strYMDHMS 返回的结果，格式 yyyyMMddHHmmss，String 类型
	 * @exception 得到系统当前年月日小时分秒数据字符串错误
	 */
	public static String getHMS() {
		String strYMDHMS = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
		strYMDHMS = formatter.format(currentDateTime);
		return strYMDHMS;
	}

	/**
	 * 得到系统当前年月日小时分秒毫秒数据字符串
	 * @return strYMDHMSS 返回的结果，格式 yyyyMMddHHmmssSSS，String 类型
	 * @exception 得到系统当前年月日小时分秒毫秒数据字符串错误
	 */
	public static String getYMDHMSS() {
		String strYMDHMSS = "";
		Date currentDateTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		strYMDHMSS = formatter.format(currentDateTime);
		return strYMDHMSS;
	}

	/**
	 * 获取当期日期格式yyyyMMdd
	 * @return Date
	 */
	public static Date currentDateToDate() {
		Date currentDateTime = new Date();
		Date yyyymmdd = null;
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		try {
			yyyymmdd = formatter.parse(formatter.format(currentDateTime));
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return yyyymmdd;
	}
	
	/**
	 * 获取系统当前日期格式化字符串
	 * @return Date
	 */
	public static Date currentDate() {
		Date currentDateTime = new Date();
		Date yyyymmdd = null;
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			yyyymmdd = formatter.parse(formatter.format(currentDateTime));
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return yyyymmdd;
	}

	/**
	 * 获取系统当前日期的前一天yyyy-MM-dd
	 * @return Date
	 */
	public static Date beforeCurrentDate(){
		Date ret = null;
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		try {
			Calendar calendar = Calendar.getInstance();
//			calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - 1);
			calendar.add(Calendar.DAY_OF_MONTH, -1);
			ret = formatter.parse(formatter.format(calendar.getTime()));
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return ret;
	}
	
	/**
	 * 比较输入日期与当前日期(日期格式：yyyy-MM-dd)
	 * @return int 小于0，输入日期比当前日期早；0，输入日期与当前日期相等；大于0，输入日期比当前日期晚。
	 */
	public static int compareToCurrentDate(Date compareDate){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		int ret = 0;
		try {
			dateFormat.parse(dateFormat.format(compareDate));
			Date currentDate = DateTimeUtils.getDate(DateTimeUtils.getDate());
			ret = compareDate.compareTo(currentDate);
		} catch (ParseException e) {
			log.error("格式化日期时间异常！" + e);
		}
		return ret;
	}
	
	/**
	 * 
	 * 日期格式化函数
	 * @param dateTimeStr
	 * @return Date
	 */
	public static Date formatDateTime(String dateTimeStr) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date formatDateTime = null;
		try {
			formatDateTime = sdf.parse(dateTimeStr);
		} catch (ParseException e) {
			log.error("格式化日期时间异常！" + e.getMessage());
		}
		return formatDateTime;
	}

	/**
	 * 格式化时间字符串(Date类型格式化为指定格式)
	 * @param tempDateTime
	 * @return String
	 */
	public static String getTimeStr(Date tempDateTime) {
		String moedifiedTime = null;
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss");
			moedifiedTime = new String(dateFormat.format(tempDateTime));
		} catch (RuntimeException e) {
			log.error("格式化日期时间异常！" + e);
		}
		return moedifiedTime;
	}
	
	/**
	 * 从date类型格式化为字符串类型的指定格式
	 * @param tempDateTime
	 * @return String
	 */
	public static String getTimeStrFromDate(Date tempDateTime) {
		String moedifiedTime = null;
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyyMMddHHmmss");
			moedifiedTime = new String(dateFormat.format(tempDateTime));
		} catch (RuntimeException e) {
			log.error("格式化日期时间异常！" + e);
		}
		return moedifiedTime;
	}
	
	/**
	 * 从Date类型格式取得日期字符串"yyyyMMdd"
	 * @param tempDateTime
	 * @return
	 * 20090508 xingyan add
	 */
	public static String getDateStringFromDate(Date tempDateTime) {
		String moedifiedTime = null;
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyyMMdd");
			moedifiedTime = new String(dateFormat.format(tempDateTime));
		} catch (RuntimeException e) {
			log.error("格式化日期时间异常！" + e);
		}
		return moedifiedTime;
	}
	
	/**
	 * 根据固定格式得到日期字符串,用于农行支付
	 * @param tempDateTime
	 * @return String
	 */
	public static String getDateStringFromDateTime(Date tempDateTime) {
		String moedifiedTime = null;
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy/MM/dd");
			moedifiedTime = new String(dateFormat.format(tempDateTime));
		} catch (RuntimeException e) {
			log.error("格式化日期异常！" + e);
		}
		return moedifiedTime;
	}
	
	/**
	 * 根据固定格式得到时间字符串,用于农行支付
	 * @param tempDateTime
	 * @return String
	 */
	public static String getTimeStringFromDateTime(Date tempDateTime) {
		String moedifiedTime = null;
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"HH:mm:ss");
			moedifiedTime = new String(dateFormat.format(tempDateTime));
		} catch (RuntimeException e) {
			log.error("格式化时间异常！" + e);
		}
		return moedifiedTime;
	}

	/**
	 * 根据固定格式"yyyy-MM-dd HH:mm:ss"得到时间字符串
	 * @param tempDateTime
	 * @return
	 */
	public static String getDateTimeStringFromDateTime(Date tempDateTime) {
		String moedifiedTime = null;
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss");
			moedifiedTime = new String(dateFormat.format(tempDateTime));
		} catch (RuntimeException e) {
			log.error("格式化时间异常！" + e);
		}
		return moedifiedTime;
	}

	/**
	 * 根据日期字符串获得日期类型对象
	 * @param strDate
	 * @return Date
	 */
	public static Date getDate(String strDate) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return formatter.parse(strDate);
		} catch (ParseException e) {
			log.error(e.getMessage());
			return null;
		}
	}

	/**
	 * 根据日期时间字符串获得日期时间类型对象
	 * @param strDateTime
	 * @return Date
	 */
	public static Date getFormatDateTime(String strDateTime) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			return formatter.parse(strDateTime);
		} catch (ParseException e) {
			log.error(e.getMessage());
			return null;
		}
	}
	/**
	 * 根据日期时间字符串，取得日期部分的字符串
	 * @param strDateTime
	 * @return String
	 */
	public static String getDateString(String strDateTime) {
		String strYear = "";
		SimpleDateFormat formatterDate = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		try {
			Date parseDate = formatter.parse(strDateTime);
			strYear = formatterDate.format(parseDate);
		} catch (ParseException e) {
			log.error(e.getMessage());
			return null;
		}
		return strYear;
	}
	
	/**
	 * 根据日期时间字符串，取得时间部分的字符串
	 * @param strDateTime
	 * @return String
	 */
	public static String getTimeString(String strDateTime) {
		String strTime = "";
		SimpleDateFormat formatterDate = new SimpleDateFormat("HH:mm:ss");
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		try {
			Date parseDate = formatter.parse(strDateTime);
			strTime = formatterDate.format(parseDate);
		} catch (ParseException e) {
			log.error(e.getMessage());
			return null;
		}
		return strTime;
	}
	
	/**
	 * 计算两个时间的间隔天数
	 * @param strDateStart
	 * @param strDateEnd
	 * @return long
	 */
	public static long getTimes(String strDateStart, String strDateEnd) {
			Date dateTime = getFormatDateTime(strDateStart);
			Date dateTime2 = getFormatDateTime(strDateEnd);
			return dateTime.getTime() - dateTime2.getTime();
	}
	
	/**
	 * 根据日期时间字符串，取得格式化的字符串
	 * @param strDateTime
	 * @return String
	 */
	public static String getAllDateTimeString(String strDateTime) {
		String strAllDateTiem = "";
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		SimpleDateFormat formatterDate = new SimpleDateFormat("yyyyMMddHHmmss");
		try {
			Date parseDate = formatter.parse(strDateTime);
			strAllDateTiem = formatterDate.format(parseDate);
		} catch (ParseException e) {
			log.error(e.getMessage());
			return null;
		}
		return strAllDateTiem;
	}
	/**
	 * 根据日期时间字符串，取得格式化的字符串
	 * @param strDateTime
	 * @return String
	 */
	public static String getFormatDateTimeString_new(String strDateTime) {
		String strAllDateTiem = "";
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
		SimpleDateFormat formatterDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			Date parseDate = formatter.parse(strDateTime);
			strAllDateTiem = formatterDate.format(parseDate);
		} catch (ParseException e) {
			log.error(e.getMessage());
			return null;
		}
		return strAllDateTiem;
	}
	
	/**
	 * 从当前时间获取间隔ss秒后的时间
	 * @param ss
	 * @return Date
	 */
	public static Date addToDateNow(int ss)
	{
		try {
			Date myDate=new java.util.Date();
			long myTime=(myDate.getTime()/1000)+1800;
			myDate.setTime(myTime*1000);
			return myDate;
		} catch (RuntimeException e) {
			log.error("从当前时间获取间隔时间异常!");
			return null;
		}
	}
	/**
	 * 只得到小时和分钟的时间格式
	 * wangbo 2009.5.5
	 * @param strDateTime
	 * @return
	 */
	public static Date getHMFormatDateTime(String strDateTime) {
		SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
		try {
			return formatter.parse(strDateTime);
		} catch (ParseException e) {
			log.error(e.getMessage());
			return null;
		}
	}
	/**
	 * 只得到小时和分钟的时间字符串格式
	 * wangbo 2009.5.5
	 * @param tempDateTime
	 * @return
	 */
	public static String getHMStringFromDateTime(Date tempDateTime) {
		String moedifiedTime = null;
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
			moedifiedTime = new String(dateFormat.format(tempDateTime));
		} catch (RuntimeException e) {
			log.error("格式化时间异常！" + e);
		}
		return moedifiedTime;
	}
	/**
	 * 比较两个时间大小
	 * wangbo 2009.5.5
	 * @param first
	 * @param second
	 * @return
	 */
	public static int compareTwoDate(Date first, Date second){
		Calendar c1=java.util.Calendar.getInstance();
        Calendar c2=java.util.Calendar.getInstance();
        
        c1.setTime(first);
        c2.setTime(second);
        
		return c1.compareTo(c2);
	}

	/**
	* 取得当前日期所在周的第一天
	*
	* @param date
	* @return
	*/
	public static Date getFirstDayOfWeek(Date date) {
		Calendar c = new GregorianCalendar();
		c.setFirstDayOfWeek(Calendar.MONDAY);
		c.setTime(date);
		c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday
		return c.getTime ();
	}

	/**
	* 取得当前日期所在周的最后一天
	*
	* @param date
	* @return
	*/
	public static Date getLastDayOfWeek(Date date) {
		Calendar c = new GregorianCalendar();
		c.setFirstDayOfWeek(Calendar.MONDAY);
		c.setTime(date);
		c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
		return c.getTime();
	}


	
	/**
	 * 转换时间字符串为oracle支持的日期格式"yyyy-MM-dd HH:mm:ss,yyyy/MM/dd HH:mm:ss"
	 * @param dateStr 
	 * @return String
	 */
	public static Date getDateCommon(String dateStr){
		Date reDate=null;
		try{
			DateFormat df=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
			reDate=df.parse(dateStr);
		}catch(Exception e){
			try{
				DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				reDate=df.parse(dateStr);
			}catch(Exception ee){
				log.error("农行对账转换日期失败！");
				System.out.println("转化日期出错！");
			}
			
		}
		return reDate;
	}
	/**
	 * 将date转成str（yyyy/MM/dd）
	 * @param date
	 * @return
	 */
	public static String getFormatStr(Date date){
		return new SimpleDateFormat("yyyy/MM/dd").format(date);
	}
	
	/**
	 * 将date转成str（yyyy-MM-dd）
	 * @param date
	 * @return
	 */
	public static String getFormatStr1(Date date){
		return new SimpleDateFormat("yyyy-MM-dd").format(date);
	}
	
	/**
     * 将string（yyyy-MM-dd）转成str（yyyyMMdd）
     * @param date
     * @return
     */
    public static String getFormatString(String str){
        String oldStr = str;
        String newStr = "";
        try{
            if( 10 == oldStr.length()){
                newStr = oldStr.substring(0, 4);
                newStr += oldStr.substring(5, 7);
                newStr += oldStr.substring(8, 10);
            }else{
                log.error("日期字符串格式不为yyyy-MM-dd！");
                System.out.println("日期字符串格式不为yyyy-MM-dd！");
            }            
        }catch(Exception e){
            log.error("转化日期失败！"+e.getMessage());
            System.out.println("转化日期出错！"+e.getMessage());
          
        }
        
        return newStr;
    }
    }
